/**
 * @file RunnerManagement_interface.h
 * @author Фетисов Михаил Вячеславович (fetisov.michael@yandex.ru)
 * @brief Объявление интерфейса доступа к функциям управления моделированием из плагинов.
 * @version 0.1
 * @date 2023-05-06
 *
 * @copyright MIT: Michael Fetisov, Anton Bushev
 *
 */
#ifndef simodo_shell_RunnerManagement_interface_H
#define simodo_shell_RunnerManagement_interface_H

#include <QString>

namespace simodo::shell
{

enum class RunnerState
{
    Stoped,
    Paused,
    Running
};

/**
 * @brief Интерфейс управления моделированием со стороны плагинов (см. метод Access_interface::getRunnerManagement).
 * 
 * @details
 * Данный интерфейс описывает поведение управления моделированием оболочки со стороны плагинов моделирующих модулей
 * (ранеров). Т.е. модулирующие модули могут управлять состоянием моделирования в оболочке, передавать ей 
 * данные моделирования для отображения (см. received), а также другие плагины могут передавать управляющие 
 * данные моделирующему модулю, который в данный момент выполняет моделирование (см. send).
 * 
 * Состояния моделирования, которые отслеживает оболочка описаны в интерфейсе Runner_interface.
 *
 */
class RunnerManagement_interface
{
public:
    virtual ~RunnerManagement_interface() = default;

    /**
     * @brief Нотификация о начале моделирования.
     * 
     * Данный метод приводит к изменению состояния моделирования (см. Runner_interface).
     * 
     */
    virtual void started() = 0;

    /**
     * @brief Нотификация о приостановке моделирования.
     * 
     * Данный метод приводит к изменению состояния моделирования (см. Runner_interface).
     * 
     */
    virtual void paused() = 0;

    /**
     * @brief Нотификация о остановке (прекращении) моделирования.
     * 
     * Данный метод приводит к изменению состояния моделирования (см. Runner_interface).
     * 
     */
    virtual void stoped() = 0;

    /**
     * @brief Нотификация о получении данных моделирования.
     * 
     * Данные моделирования передаются плагинам, которые предоставляют интерфейс AdaptorModeling_interface.
     * 
     * @details
     * Ожидаемые поддерживаемые форматы данных:
     * 
     * #Time:<значение>
     * 
     * #Values:<получатель>.<хост>.<тип>.<метод>:<значение>
     * 
     * , где:
     * 
     * <получатель> - наименование получателя
     * 
     * <хост> - ID хоста, откуда пришли данные (пока всегда 0, зарезервирован)
     * 
     * <тип> - тип передачи (зарезервирован)
     * 
     * <метод> - метод обработки
     * 
     * <значение> - значения, разделённые символом '/'
     * 
     * Данные с префиксом #Time в начале строки интерпретируются как метки времени и выводятся в строку статуса.
     * 
     * Данные с префиксом #Values в начале строки интерпретируются как данные для плагинов и передаются им 
     * с использованием метода AdaptorModeling_interface::acceptData. При этом выполняется разделение значений 
     * (сплит) на массив строк по символу '/'.
     * 
     * Например, строка '#Values:Graph3D.0.U.addPoint:1/-5000.000000/0.000000/0.000000' будет передана плагину
     * панели (точнее, его адаптеру) с id = 'Graph3D' в следующем вызове: 
     * 
     * @code {.cpp}
     * bool ok = panel_adaptor->acceptData('addPoint', {'1','-5000.000000','0.000000','0.000000'});
     * @endcode
     * 
     * Если в начале полученной строки нет символа '#', то полученная строка выводится на глобальную панель.
     * 
     * @todo
     * Не учтено изменение титула панели!
     * 
     * @attention
     * Описанный алгоритм будет изменяться.
     * 
     * @param data строка данных, полученная от моделирующего модуля
     */
    virtual void received(const QString & data) = 0;

    /**
     * @brief Передача управляющих данных моделирующему модулю
     * 
     * @param data управляющие данные
     */
    virtual void send(const QString & data) = 0;

    /**
     * @brief Нотификация о том, что документ файла path_to_file изменил содержимое
     * 
     * Эта нотификация нужна для автоматического запуска выполнения.
    */
    virtual void notifyContentChanged(const QString & path_to_file) = 0;

};

}

#endif // simodo_shell_RunnerManagement_interface_H